#!/bin/bash
#多功能混合脚本

#模块菜单展示函数，输入可选择模块信息
module_menu() {
module_array=("初始化模块" "虚拟机状态模块" "用户管理模块" "安装包管理模块" "系统管理模块" "软件调用模块" "其他功能模块" "退出") 
for ((i=0; i<${#module_array[@]}; i++)) ;
  do
    echo -e "\e[32m\t选项$(($i+1))--${module_array[$i]}\e[0m"
  done
}
#延迟函数，随机延迟0.1-1秒，便于执行结果的查看
date() {
number=$((RANDOM % 10 + 1 ))
sleep_time=0.$number
sleep $sleep_time
echo ""
}
#模块帮助信息，针对模块选择时的错误输出
module_message() {
echo -e "\e[33m\t请输入选项1-${#module_array[@]}\e[0m"
}

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>初始化模块<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#初始化功能菜单函数，输出初始化模块的各个功能
start_menu() {
start_array=("永久关闭防火墙" "永久关闭Selinux" "更换阿里云仓库" "安装常用软件" "退出此模块")
for ((i=0; i<${#start_array[@]}; i++)); 
do
  echo -e "\e[32m\t选项$(($i+1))--${start_array[$i]}\e[0m"
done
}
#防火墙关闭函数，用于永久关闭防火墙
shutdown_firewall() {
systemctl disable --now firewalld &> /dev/null
if [ $? -eq 0 ];then
  echo -e "\e[32m\t防火墙已关闭且配置为永久关闭\e[0m"
else 
  echo -e "\e[31m\t防火墙关闭失败\e[0m"
fi
}
#Selinux关闭函数，用于永久关闭Selinux
shutdown_selinux() {
sed -i 's/enforing/disabled/g' /etc/selinux/config 
if [ $? -eq 0 ];then
  echo -e "\e[32m\tSelinux已关闭且配置为永久关闭,生效需要进行重启\e[0m"
else 
  echo -e "\e[31m\tSelinux配置失败\e[0m"
fi
}
#更换阿里云源仓库函数
change_yum_repositoy_aliyun() {
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo &> /dev/null
if [ $? -eq 0 ];then
  echo -e "\e[32m\t阿里云yum仓库更换完毕\e[0m"
else 
  echo -e "\e[31m\t阿里云yum仓库更换失败\e[0m"
fi
}
#安装常用软件函数，用于安装vim和wget软件包
install_normal_packages() {
yum -y install wget vim lsof &> /dev/null
if [ $? -eq 0 ];then
  echo -e "\e[32m\t常用软件安装完毕\e[0m"
else 
  echo -e "\e[31m\t安装失败，查看当前yum源是否可用\e[0m"
fi
}
#错误提示函数，用于在选择功能不正确时进行提示
start_message() {
echo -e "\e[33m\t请输入选项1-${#start_array[@]}\e[0m"
}

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>虚拟机状态模块<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#状态模块菜单函数，用于展示状态模块的功能
status_menu() {
status_array=("查看磁盘可用空间" "查看内存可用空间" "查看平均负载量" "查看当前主机名" "查看当前所使用的ip" "查看当前用户名" "退出")
for ((i=0; i<${#status_array[@]}; i++)) 
do 
  echo -e "\e[32m\t选项$(($i+1))--${status_array[$i]}\e[0m"
done
}
#剩余磁盘空间函数，输出当前磁盘空间剩余量
show_fdisk_free() {
fdisk_free=`df -hT  | grep -w "/"| awk '{print $5}'`
fdisk_used_percentage=`df -hT  | grep -w "/"| awk '{print $6}'`
echo -e "\e[32m\t磁盘剩余可用空间为:${fdisk_free:-0},已使用百分比为:${fdisk_used_percentage:-100%}\e[0m"
}
#剩余内存函数，输出当前内存剩余空间量
show_mem_free() {
mem_used=`free -h | grep "Mem" | awk '{print $3}'`
mem_free=`free -h | grep "Mem" | awk '{print $4}'`
echo -e "\e[32m\t内存剩余可用空间为:${mem_free:-0},已使用空间为:${mem_used:-10G}\e[0m"
}
#平均负载函数，输出当前主机在1min，5min，15min内的平均负载量
show_avg_load() {
avg_load=`uptime | awk -F":" '{print $NF}'`
avg_number=1
for i in $avg_load
do  
  case $avg_number in 
  1)
    avg_time="一";;
  2)
    avg_time="五";;
  3)  
    avg_time="十五";;
  esac
  avg_number=$(($avg_number+1))
  echo -e "\e[32m\t$avg_time分钟平均负载为:$i\e[0m"
done
}
#主机名展示函数，用于展示当前主机的主机名
show_hostname() {
hostname=$HOSTNAME
echo -e "\e[32m\t当前主机名为:$hostname\e[0m"
}
#ip地址展示函数，用于展示当前主机所使用的ip地址
show_ipaddr() {
number=1
ip_addr=`ip a | grep -w "inet" | awk '{print $2}'`
for i in $ip_addr
do 
   echo -e "\e[32m\t本机${j}号ip为:$i\e[0m"
   number=$(($number+1))
done
}
#用户展示函数，用于展示当前主机所使用用户
show_user() {
now_user=$USER
echo -e "\e[32m\t当前使用的用户为:$now_user\e[0m"
}
#错误信息函数，用于输入选项非法使返回提示信息
status_message() {
echo -e "\e[33m\t请输入选项1-${#status_array[@]}\e[0m"
}

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>用户管理模块<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#用户管理菜单函数，用于展示用户管理模块可用功能
#搜集用户所有信息，存储到一个列表中，用于后续的使用
user_list=()
user_list_number=0
while read user_content
do
  user_list[$user_list_number]=$user_content
  user_list_number=$(($user_list_number+1))
done < /etc/passwd
#用户管理菜单函数,用于输出用户管理模块功能
user_menu() {
user_array=("查看所有用户数量" "查看系统用户数量" "查看普通用户数量" "创建用户" "删除用户" "查看用户详细信息" "退出")
for ((i=0; i<${#user_array[@]}; i++)) 
do
  echo -e "\e[32m\t选项$(($i+1))--${user_array[$i]}\e[0m"
done
}
#所有用户数量计算函数，计算系统所有用户的数量
show_all_user_number() {
all_user_number=${#user_list[@]}
echo -e "\e[32m\t系统所有用户的数量为:$all_user_number\e[0m"
}
#系统用户数量计算函数，用于计算系统用户的数量
show_os_user_number() {
os_user_number=0
for ((i=0; i<${#user_list[@]}; i++))
do 
  flag_number=`echo ${user_list[$i]} | awk -F":" '{print $3}'`
  if [ $flag_number -lt 1000 ];then
  os_user_number=$(($os_user_number+1))
  fi
done
echo -e "\e[32m\t系统用户的数量为:$os_user_number\e[0m"
}
#普通用户数量计算函数，用于计算普通用户的数量
show_normal_user_number() {
normal_user_number=0
for ((i=0; i<${#user_list[@]}; i++))
do 
  flag_number=`echo ${user_list[$i]} | awk -F":" '{print $3}'`
  if [ $flag_number -ge 1000 ];then
  normal_user_number=$(($normal_user_number+1))
  fi
done
echo -e "\e[32m\t普通用户的数量为:$normal_user_number\e[0m"
}
#用户密码设置函数，与创建用户函数联合使用，共同完成用户创建并设置密码功能，也可以用于用户密码的设置
set_user_password() {
read -p "输入你要修改密码的用户:" user
read -s -p "输入你要修改密码" password
echo "$password" | passwd --stdin $user &> /dev/null
if [ $? -eq 0 ];then
  echo -e "\n\e[32m\t用户${user}密码修改成功,修改后的密码为:${password}\e[0m" 
else    
  echo -e "\e[31m\t用户${user}密码修改失败\e[0m"
fi
}
#用户创建函数，为创建指定用户
create_user() {
read -p "输入你要创建的用户:" user_name
id $user_name &> /dev/null
if [ $? -eq 0 ];then
  echo -e  "\e[31m用户${user_name}已存在\e[0m"
else 
  useradd $user_name &> /dev/null
  echo -e "\e[32m\t用户${user_name}创建完成\e[0m" 
  echo -e "\e[32m\t进行密码修改\e[0m"
  set_user_password
fi
}
#用户删除函数，用于已有用户的删除
delete_user() {
read -p "输入你要删除的用户:" user_name
id $user_name &> /dev/null
if [ $? -eq 0 ];then
   userdel -r $user_name &> /dev/null 
   if [ $? -eq 0 ];then
      echo -e "\e[32m\t用户${user_name}删除完毕\e[0m"
   fi
else 
   echo -e "\e[31m没有用户${user_name},无法使用删除操作\e[0m"
fi
}
#用户信息展示函数，用于查看用户的详细信息
show_user_message() {
flag=0
read -p "输入你要查看的用户名:" user_name
for ((i=0; i<${#user_list[@]}; i++))
do 
  all_user_name_message=${user_list[$i]}
  all_user_name=${all_user_name_message%%:*}
  if [ $user_name == $all_user_name ] ;then
    flag=1 
  fi
done
if [ $flag -eq 1 ];then
    echo -e "\e[32m\t用户${user_name}的详细信息为:$all_user_name_message\e[0m"
else
    echo -e "\e[31m\t用户${user_name}不存在\e[0m"
fi
}
#错误信息展示函数，在用户输入的选项有误时，显示提示信息
user_message() {
echo -e "\e[33m\t请输入选项1-${#user_array[@]}\e[0m"
}

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>软件包管理模块<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#软件包模块功能函数，用于输出软件包管理模块的功能
packages_menu() {
packages_array=("初始化MongoDB" "初始化Redis" "初始化MySQL" "初始化NGINX" "初始化Apache" "初始化Tomcat" "安装指定安装包" "查找软件包名称" "退出") 
for ((i=0; i<${#packages_array[@]}; i++))
do
  echo -e "\e[32m\t选项$(($i+1))--${packages_array[$i]}\e[0m"
done
}
#MongoDB配置函数，用于MongoDB的安装
set_mongodb() {
echo "mongodb"
}
#Redis配置函数，用于Redis的安装
set_redis() {
echo "set_redis"
}
#MySQL配置函数，用于MySQL的安装
set_mysql() {
echo "set_mysql"
}
#NGINX配置函数，用于NGINX的安装
set_nginx() {
echo "set_nginx"
}
#Apache启动函数，将Apache启动并配置为开机自动启动
start_apache() {
systemctl enable --now httpd &> /dev/null
if [ $? -eq 0 ];then
  echo -e "\e[32m\tApache成功开启并配置为开机自启\e[0m"
  flag=1
else
  echo "\e[31mApache未成功开启和配置为开机自启\e[0m"
  flag=0
fi
}
#Apache配置函数，用于Apache的安装
set_apache() {
process=`ps -ef | grep "nginx" | grep -v "grep"`
if [[ -z $process ]];then
  for i in `lsof -i:80 | grep -v "PID" | awk '{print $2}' `
  do
    kill -9 $i && echo -e "\e[32m\t80端口进程已被杀死\e[0m"  || echo -e "\e[31m\t80端口进程未能成功杀死\e[0m"
  done
  start_apache
  date  
  if [ $flag -eq 0 ];then 
     echo -e "\e[33m\t尝试安装Apache\e[0m"
     yum -y install httpd &> /dev/null
     if [ $? -eq 0 ];then
        echo -e "\e[32m\tApache安装成功，重新进行启动\e[0m"
        start_apache
     else
        echo -e "\e[31m\tApache安装失败，查看yum源是否可用\e[0m"
     fi
  fi
else
  echo -e "\e[32m\tApache正在运行中，无需配置\e[0m"
fi
}
#Tomcat安装函数，用于Tomcat的安装
set_tomcat() {
echo "set_tomcat"
}
#安装函数，指定要安装的安装包，进行安装
install_packages() {
read -p "输入你要安装的软件包名:" -a install_package_array
for ((i=0; i<${#install_package_array[@]}; i++))
do
    yum -y install ${install_package_array[$i]} &> /dev/null
    if [ $? -eq 0 ];then
      echo -e "\e[32m\t${install_package_array[$i]}安装成功\e[0m"
    else 
      echo -e "\e[31m\t${install_package_array[$i]}安装失败\e[0m"
    fi
done
}
#寻找安装包函数，根据用户输入的命令寻找提供命令的安装包
find_packages() {
read -p "输入你要查询的命令:" commands
install_packages=`yum provides $commands | grep "x86_64" | awk -F":" '{print $(NF-1)}' | head -1 | tr -d "\n"`
if [  -e $install_packages ];then
   echo -e "\e[33m\t没有命令${commands}对应的安装包\e[0m"
else 
   yum -y install $install_packages &> /dev/null 
   if [ $? -eq 0 ];then
     echo -e "\e[32m\t${commands}所需安装包${install_packages}成功安装\e[0m"
   else 
     echo -e "\e[31m\t${commands}所需安装包${install_packages}未能成功安装\e[0m"
   fi
fi
}
#错误信息输出函数，当用户输入选项错误时，输出提示信息
packages_message() {
echo -e "\e[33m\t请输入选项1-${#packages_array[@]}\e[0m"
}

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>系统管理模块<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#系统管理模块菜单函数，输出系统管理模块的功能
os_menu() {
os_array=("关机" "重启" "同步阿里云时间" "配置dns解析" "修改主机名" "配置ssh认证" "退出")
for ((i=0; i<${#os_array[@]}; i++))
do
  echo -e "\e[32m\t选项$(($i+1))--${os_array[$i]}\e[0m"
done
}
#关机函数，用于设置定时关机
shutdown_host() {
echo -e  "\e[33m\t开始设置关机时间\e[0m"
read -p "输入你要关机的时间(单位为秒,默认为0)" second
second=${second:-0}
shutdown -h -t $second
if [ $? -eq 0 ];then
  echo "关机配置成功,主机将在${second}s后关机"
fi
}
#重启函数，用于设置定时重启
reboot_host() {
echo -e  "\e[33m\t开始设置重启时间\e[0m"
read -p "输入你要关机的时间(单位为秒)" second
second=${second:-0}
shutdown -r -t $second
if [ $? -eq 0 ];then
  echo "关机配置成功,主机将在${second}s后重启"
fi
}
#时间同步函数，用于主机时间的同步
ntpdate_start() {
ntpdate ntp.aliyun.com &> /dev/null
if [[ $? -eq 0 || $? -eq 1 ]];then
   echo -e "\e[32m\t阿里云时间已同步成功\e[0m"
else  
   echo -e "\e[33m\t阿里云时间同步失败\e[0m"
fi
}
#时间同步函数，可以对ntp服务启动与安装进行判断并进行下一步操作
sync_time() {
systemctl status ntpd &> /dev/null
if [ $? -eq 0 ];then
   ntpdate_start
else
   systemctl enable --now ntpd &> /dev/null
   if [ $? -eq 0 ];then
      ntpdate_start
   else 
      yum -y install ntp &> /dev/null
      if [ $? -eq 0 ];then
         systemctl enable --now ntpd &> /dev/null
         ntpdate_start
      else  
         echo -e "\e\t[31m无法安装ntp服务，检查yum仓库是否可用\e[m"
      fi
   fi
fi
}
#dns配置函数，用于主机dns的配置
set_dns() {
while true;
do
  read -p "输入你要添加的dns解析的数量:" number
  if [[ $number =~ ^[0-9]+$ ]];then
     for ((i=0; i<$number; i++))
     do
       read -p "输入你要添加的主机ip:" ip_addr
       ip_addr=${ip_addr:-127.0.0.1}
       ip_part_one=`echo $ip_addr | awk -F"." '{print $1}'`
       ip_part_two=`echo $ip_addr | awk -F"." '{print $2}'`
       ip_part_three=`echo $ip_addr | awk -F"." '{print $3}'`
       ip_part_four=`echo $ip_addr | awk -F"." '{print $4}'`
       if [[ $ip_part_one  =~ ^[0-9]+$ ]] && [[ $ip_part_two =~ ^[0-9]+$ ]] && [[ $ip_part_three =~ ^[0-9]+$ ]] && [[ $ip_part_four =~ ^[0-9]+$ ]] && [[ $ip_part_one  -ge 0 && $ip_part_one -le 255  ]] && [[ $ip_part_two  -ge 0 && $ip_part_two -le 255 ]] && [[ $ip_part_three  -ge 0 && $ip_part_three -le 255 ]] && [[ $ip_part_four  -ge 0 && $ip_part_four -le 255 ]] ;then 
         ping $ip_addr -W 1 -c1 &> /dev/null
         if [ $? -eq 0 ];then
            read -p "输入你要进行配置的域名:" domain 
            line="$ip_addr $domain"
            echo $line >> /etc/hosts
            if [ $? -eq 0 ];then
               echo -e "\e[32m\t${line}已经成功加入到/etc/hosts文件中\e[0m"
            fi
         else
            echo -e "\e[31m\t输入的地址${ip_addr}不能进行正常的通信\e[0m"
         fi   
       else 
          echo -e "\e[31m\t输入的ip地址不合法\e[0m"
       fi
     done
  elif [[ -z $number ]];then
     echo -e "\e[33m\t由于输入的为空值，请重新输入\e[0m"
     continue
  else  
     echo -e "\e[31m\t输入的不是数字，请重新输入\e[0m"
     continue
  fi
  break
done
#主机名配置函数，用于主机名的设置
}
set_hostname() {
read -p "输入你要使用的主机名:" hostname
hostname=${hostname:-$HOSTNAME}
hostnamectl set-hostname $hostname 
if [ $? -eq 0 ];then
  echo -e "\e[32m\t主机名成功配置为${hostname},生效需重启或断开重连\e[0m"
else 
  echo -e "\e[31m\t主机名为成功配置\e[0m"
fi                                                       
}
#ssh配置函数，用于对主机进行ssh免密配置
#流程：生成公钥和私钥（判断是否生成公钥和私钥）-->输入要进行配置的地址（判断指纹信息是否已经含有）
set_ssh() {
echo "配置ssh"
#判断是否已经生成公钥和私钥
if [ -f ~/.ssh/id_rsa.pub ];then
  echo "公钥已生成"
else
  echo "公钥未生成，开始生成公钥"
  ssh-keygen  
fi
}
#系统模块功能帮助函数，在用户输入选项有误时，进行提示
os_message() {
echo -e "\e[33m\t请输入选项1-${#os_array[@]}\e[0m"
}

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>其他功能模块<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#其他功能模块菜单函数，输出其他功能模块的可用功能
other_menu() {
other_array=("简易计算器" "随机密码生成" "进度条输出" "退出")
for ((i=0; i<${#other_array[@]}; i++))
do
  echo -e "\e[32m\t选项$(($i+1))--${other_array[$i]}\e[0m"
done
}
#计算器函数，用于简易计算器的使用
compute() {
result=0
echo -e "\e[32m\t开始使用简易计算机功能\e[0m"
compute_array=("加运算" "减运算" "乘运算" "除运算" "整除运算" "取余运算" "幂运算" "退出")
while true;
do
  for ((i=0; i<${#compute_array[@]}; i++)) 
  do 
    echo -e "\e[32m\t选项$(($i+1))--${compute_array[$i]}\e[0m"
  done
  read -p "输入你要进行运算的数字(数字之间用空格隔开)" -a number_array
  read -p "输入你要进行的运算:" compute_choice
  compute_choice=${compute_choice:-${#compute_array[@]}}
  case $compute_choice in
    1) 
       for j in ${!number_array[@]}
       do
          result=$((${number_array[$j]}+$result))
       done
       date ;;
    2)
       for j in ${!number_array[@]}
       do
          if [ $j -eq 0 ];then
             reduce=${number_array[$j]}
          else
             result=$(($reduce-${number_array[$j]}))
          fi
       done
       date ;;
    3)
       result=1
       for j in ${!number_array[@]}
       do
          result=$((${number_array[$j]}*$result))
       done
       date ;;
    4)
       read -p "输入你要保留的小数精度:" float 
       for j in ${!number_array[@]}
       do
          if [ $j -eq 0 ];then
             relay=${number_array[$j]}
          else
             result=`echo "scale=$float ; $relay / ${number_array[$j]}" | bc -l `
          fi
       done
       date ;;
    5)
       for j in ${!number_array[@]}
       do
          if [ $j -eq 0 ];then
             relay=${number_array[$j]}
          else
             result=$(($relay / ${number_array[$j]}))
          fi
       done
       date ;;
    6)
       for j in ${!number_array[@]}
       do
          if [ $j -eq 0 ];then
             relay=${number_array[$j]}
          else
             number_two=${number_array[$j]}
             result=`echo "$relay % $number_two" | bc `
          fi
       done
       date ;;
    7)
       result=1
       for j in ${!number_array[@]}
       do
          result=$((${number_array[$j]}**$result))
       done
       date ;;
    8)
       echo -e "\e[33m\t退出简易计算器功能\e[0m"
       break ;;
    *)
       echo -e "\e[33m\t请输入选项1-${#compute_array[@]}\e[0m"
  esac
result=${result:-error}
echo -e "\e[32m\t数字进行${compute_array[$compute_choice]}结果为${result}\e[0m"
done
}
#随机函数，用于密码的随机生成
random() {
random_authtication=()
array_flag=0
authtication_array=([62]="!" [63]="@" [64]="#" [65]="$"  [66]="%"  [67]="^" [68]="&" [69]="*" [70]="(" [71]=")" [72]="+" [72]="-" [73]="\`" [74]="~" [75]="?" [76]="," [77]=":" [78]=";" [79]="." [80]="<" [81]=">" [82]="/" [83]="?" [84]="|" [85]="\\")
for i in {0..9}
do
   authtication_array[$array_flag]=$i
   array_flag=$((array_flag+1))
done
for i in {a..z}
do
   authtication_array[$array_flag]=$i
   array_flag=$((array_flag+1))
done
for i in {A..Z}
do
   authtication_array[$array_flag]=$i
   array_flag=$((array_flag+1))
done
read -p "输入你要生成的密码的位数:" number
for ((i=0; i<$number; i++)) 
do
   random_flag=$(( RANDOM % ${#authtication_array[@]} ))
   random_authtication[$i]=${authtication_array[$random_flag]}
done
echo -e  "\e[33m\t生成的密码为:\e[0m" | tr -d "\n"
for i in  "${random_authtication[@]}" ;
do
  echo  $i | tr -d "\n"
done 
echo ""
}
#进度条打印函数，用于进度条的打印
colorline() {
i=1
while true;
do
  content_color=3$((RANDOM % 7 + 1 ))
  background_color=4$((RANDOM % 7 + 1 ))
  line_color="$content_color;${background_color}m"
  line=` yes "<<" | head -$i | tr -d "\n" `
  i=$(($i+1))
  echo -e "\e[$line_color$line\e[0m"
done

}
#帮助菜单，在用户输入有误时进行提示
other_message() {
  echo -e "\e[33m\t请输入选项1-${#other_array[@]}\e[0m"
}
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>主函数模块<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#主函数，脚本的入口
main() {
echo -e "\e[33m\t欢迎使用云计算多功能脚本\e[0m"
while true; 
do
  module_menu
  read -p "输入你要使用的模块(默认为退出):" module_choice
  module_choice=${module_choice:-$((${#module_array[@]}))}
  case $module_choice in 
    1) 
      echo -e "\e\t[33m欢迎使用初始化模块\e[0m"
      while true;
      do
        start_menu
        read -p "输入你要使用的功能(默认为退出):" start_choice
        start_choice=${start_choice:-${#start_array[@]}}
        case $start_choice in 
          1) 
            shutdown_firewall
            date;;
          2) 
            shutdown_selinux
            date;;
          3) 
            change_yum_repositoy_aliyun
            date;;
          4) 
            install_normal_packages
            date;;
          5) 
            echo -e "\e\t[33m退出初始化模块\e[0m"
            break;;
          *) 
            start_message;;
        esac 
      done
      date;;
    2) 
      echo -e "\e\t[33m欢迎使用虚拟机状态查看模块\e[0m"
      while true;
      status_menu
      do
        read -p "请选择你要使用的功能(默认退出):" status_choice
        status_choice=${status_choice:-${#status_array[@]}}
        case $status_choice in 
          1) 
            show_fdisk_free
            date;;
          2) 
            show_mem_free
            date;;
          3) 
            show_avg_load
            date;;
          4) 
            show_hostname
            date;;
          5) 
            show_ipaddr
            date;;
          6) 
            show_user
            date;;
          7) 
            echo -e "\e\t[33m退出虚拟机状态查看模块\e[0m"
            break;;
          *) 
            status_message
            date;;      
        esac
      done
      date;;
    3) 
      echo -e "\e\t[33m欢迎使用用户管理模块\e[0m"
      while true; 
      do
        user_menu
        read -p "输入你要使用的功能(默认为退出):" user_choice
        user_choice=${user_choice:-${#user_array[@]}}
        case $user_choice in 
          1) 
            show_all_user_number
            date;;
          2) 
            show_os_user_number
            date;;
          3) 
            show_normal_user_number
            date;;
          4) 
            create_user
            date;;
          5) 
            delete_user
            date;;
          6) 
            show_user_message
            date;;
          7) 
            echo -e "\e\t[33m退出用户管理模块\e[0m"
            break;;
          *) 
            user_message
            date;;
        esac
      done
      date;;
    4) 
      echo -e "\e\t[33m欢迎使用安装包管理模块\e[0m"
      while true;
      do
        packages_menu
        read -p "输入你要使用的选项:" packages_choice
        packages_choice=${packages_choice:-${#packages_array[@]}}
        case $packages_choice in
          1)
             set_mongodb
             date ;;
          2)
             set_redis
             date ;;
          3)
             set_mysql
             date ;;
          4)
             set_nginx
             date ;;
          5)
             set_apache
             date ;;
          6)
             set_tomcat
             date ;;
          7)
             install_packages
             date ;;
          8)
             find_packages
             date ;;
          9)
             echo -e "\e\t[33m退出软件包管理模块\e[0m"
             break ;;
          *)
             packages_message
             date ;;
        esac
      done
      date;;
    5) 
      echo -e "\e\t[33m欢迎使用系统管理模块\e[0m"
      while true;
      do
        os_menu
        read -p "输入你要使用的选项:" os_choice
        os_choice=${os_choice:-${#os_array[@]}}
        case $os_choice in 
          1)
            shutdown_host
            date ;;
          2) 
            reboot_host
            date ;;
          3)
            sync_time
            date ;;
          4)
            set_dns
            date ;;
          5)
            set_hostname
            date ;;
          6)
            set_ssh
            date ;;
          7)
            echo -e "\e\t[33m退出系统管理模块\e[0m"
            break ;;
          *)
            os_message ;;
        esac
      done
      date;;
    6) 
      echo -e "\e\t[33m欢迎使用软件调用模块\e[0m"
      date;;
    7)
      echo -e "\e\t[33m欢迎使用其他功能模块\e[0m"
      while true; 
      do
        other_menu
        read -p "输入你要是用的功能:" other_choice
        other_choice=${other_choice:-${#other_array[@]}}
        case $other_choice in 
          1)  
            compute
            date ;;
          2) 
            random
            date ;;
          3)  
            colorline
            date ;;
          4)  
            echo -e "\e[33m退出其他功能模块\t\e[0m"
            break;;
          *)  
            other_message
            date;;
        esac
      done
      date;;
    8) 
      echo -e "\e\t[33m成功退出此脚本\e[0m"
      break;; 
    *) 
      module_message;;
  esac
done
}
main

